package com.tarena.ELSFK.day02_all;

import java.awt.Color;
import java.awt.Graphics;

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Demo01 {
	public static void main(String[] args) {
		JFrame frame = new JFrame("方块");
		MyPanel panel = new MyPanel();
		frame.add(panel);
		frame.setSize(25*10, 25*20);
		//窗口 set设置 Default默认 Close关闭 Operation操作 
		// 在关闭时退出： 当点击[X]时候退出软件
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);//"尽快"调用paint()方法
		panel.action();//窗口显示出来以后才能请求键盘输入焦点
	}
}
class MyPanel extends JPanel{
	T t;//在面板上添加的 T型方块，默认是 null
	public void action(){
		//this 代表 当前面板对象
		this.t = new T();//创建T型方块,除了8种类型以外，其他都是引用
		repaint();//重新 paint 绘制，尽快调用paint()
		//new KeyAdapter(){} 创建匿名内部类
		KeyAdapter l = new KeyAdapter(){
			//key:按键 Pressed:按下完成了 
			//按键按下以后， 会执行的方法
			//KeyEvent e 是一个对象，包含按键事件发生时候
			// KeyEvent是keyPressed方法创建的监听器
			public void keyPressed(KeyEvent e){
				int key = e.getKeyCode();//获得按键号码
				switch(key){
				case KeyEvent.VK_RIGHT: t.moveRight(); break;
				case KeyEvent.VK_LEFT: t.moveLeft(); break;
				case KeyEvent.VK_UP: t.moveUp(); break;
				//重载的方法是根据参数类型调用的
				case KeyEvent.VK_DOWN: t.moveDown(); break;
				//case KeyEvent.VK_SPACE: c1.moveDown(5); break;
				}
				repaint();//re 重新 paint 绘制，尽快调用paint()
				//[->]->c1.moveRight()->col++ ->repaint ->
				// paint() -> 根据当前的c1.col 绘制界面 
			}
		};
		//绑定 事件处理方法到 当前面板
		requestFocus();//为当前面板 请求键盘输入焦点
		addKeyListener(l);//绑定l(keyPressed方法)到当前面板,绑定后执行keyPressed()方法
	}
	public void paint(Graphics g){
		if(t==null) { return;}
		//先填充背景，再绘制方块
		g.setColor(new Color(0xdddddd));
		g.fillRect(0, 0, 25*10, 25*20);
		
		Cell[] cells = t.cells;
		for(int i=0; i<cells.length; i++){
			// i = 0 1 2 3
			Cell c = cells[i];//0取0号格,c 代表每个格子的引用
			
			g.setColor(new Color(c.color));
			int x = c.col * 25;//格的位置
			int y = c.row * 25;
			g.fillRect(x, y, 25, 25);
		}
	}
}
class I{
	Cell[] cells;//只有变量cells的值是null
	/** 构造方法：创建对象的方法，初始化属性的方法 
	 * 创建一个4格 I型的出场位置的方块
	 * */
	public I() {
		cells = new Cell[4];//4个空位置
		cells[0] = new Cell(0, 4, 0x0000ff);
		cells[1] = new Cell(0, 3, 0x0000ff);
		cells[2] = new Cell(0, 5, 0x0000ff);
		cells[3] = new Cell(0, 6, 0x0000ff);
	}
	public void moveDown(){
		cells[0].moveDown();	
		cells[1].moveDown();
		cells[2].moveDown();	
		cells[3].moveDown();
	}
	public void moveUp(){
		for(int i=0; i<cells.length; i++){
			cells[i].moveUp();
		}
	}
	public void moveRight(){
		for(int i=0; i<cells.length; i++){
			cells[i].moveRight();
		}
	}
	public void moveLeft(){
		for(int i=0; i<cells.length; i++){
			cells[i].moveLeft();
		}
	}
}
//T型方块
class T{
	Cell[] cells;
	/** 构造器，初始化T型方块 */
	public T(){
		cells = new Cell[4];//{null, null, null, null}
		cells[0] = new Cell(0, 4, 0xff0000);//红色
		cells[1] = new Cell(0, 3, 0xff0000);
		cells[2] = new Cell(0, 5, 0xff0000);
		cells[3] = new Cell(1, 4, 0xff0000);
	}
	public void moveDown(){
		cells[0].moveDown();	cells[1].moveDown();
		cells[2].moveDown();	cells[3].moveDown();
	}
	public void moveUp(){
		for(int i=0; i<cells.length; i++){
			cells[i].moveUp();
		}
	}
	public void moveRight(){
		for(int i=0; i<cells.length; i++){
			cells[i].moveRight();
		}
	}
	public void moveLeft(){
		for(int i=0; i<cells.length; i++){
			cells[i].moveLeft();
		}
	}
}
class Cell{
	int row;
	int col;
	int color;
	//构造器
	public Cell(int row, int col, int color) {
		this.row = row;
		this.col = col;
		this.color = color;
	}
	
	/** 方法：向右移动  move:异常  Right:右 */
	//不要加static，加static是类的方法，不是对象的方法
	public void moveRight(){
		col++;
	}
	public void moveLeft(){
		col--;
	}
	public void moveUp(){
		row--;
	}
	//方法的重载：方法名一样，方法参数不同，业务功能类似
	// 业务算法不同，重载的设计是很优雅的
	/** 向下移动一步 */
	public void moveDown(){
		row++;
	}
	/** 向下移动n步 */
	public void moveDown(int step){
		row+=step;
	}
}







